<?php
// +-----------------------------------------------------------------------+
// |                                                                       |
// | WebFormsQA     (Question - Answer)                                    |
// | Copyright  (C) 2010                                                   |
// | Official site  www.scale-tech.ru                                      |
// | email          scale-tech@mail.ru                                     |
// | autor          Alexander Demachev                                     |
// |                                                                       |
// | This program is free software; you can redistribute it and/or modify  |
// | it under the terms of the GNU General Public License as published by  |
// | the Free Software Foundation; version 2 of the License.               |
// |                                                                       |
// | This program is distributed in the hope that it will be useful,       |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of        |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
// | GNU General Public License for more details.                          |
// +-----------------------------------------------------------------------+

/**
 * @file question_base.test.php
 * @brief файл содержит код для тестирования класса QuestionBase \n
 * @include question_base.test.php
 */


/*! @addtogroup TestWebFormsQA Tестирование проекта WebFormsQA
 *  Группа включает классы для тестирования исходного кода
 *  @{
 */


/**
 * @class QuestionBaseTest
 * @brief Класс для проверки методов класса по работе и базой данных Questions \n
  *        Исходный код [ @ref question_base.test.php ] 
 */
class QuestionBaseTest extends PHPUnit_TestCase {

    /** Метод проверяет добавляение данных с вопросом */
    function testAddQuestionOrSearch()
    {
        $base       = &$GLOBALS["base"];

        // добавляем вопрос в категорию 1_2_1 id = 4

        $id_category    = 4;
        $question       = "Кто такие Колобок и два жирафа";
        $email          = "alex@rambler.ru";
        $id 			= "";

        
        $flag = $base->addQuestion($id_category, $question, $email, &$id);
        
        // вопрос добавлен
        $this->assertTrue($flag);
        $this->assertEquals(1, $id);

        $question       = "Кто ТАКИЕ";
        $flag = $base->addQuestion($id_category, $question, $email, &$id);
        $this->assertTrue($flag);
        $this->assertEquals(2, $id);
    }


    /** Метод проверяет запрос списка вопросов по выбранной категории. */
    function testGetCategoryQuestions()
    {
        $base           = &$GLOBALS["base"];
        $id_category    = 1;
        $question       = "Кто такие Колобок";
        $email          = "alex@rambler.ru";

        $flag = $base->addQuestion($id_category, $question, $email, $id);
        $this->assertTrue($flag);

        $question2      = "Кто такие Жирафы";
        $flag = $base->addQuestion($id_category, $question2, $email, $id2);
        $this->assertTrue($flag);

        // без ответа, вопрос не получим
        $answer     = "Круглый монстр";
        $answer2    = "Длинный монстр";
        $this->assertTrue($base->addAnswer($id, $answer));
        $this->assertTrue($base->addAnswer($id2, $answer2));

        $this->assertEquals(2, $base->getCategoryQuestions($id_category, $out));

        // question - индекс 2
        $this->assertEquals($question, $out[0][2]);
        $this->assertEquals($question2, $out[1][2]);
    }

    /** Метод проверяет запрос списка вопросов на которые нет ответа. */
    function testgetAllQuestionsAnswerOrNot()
    {

        $base           = &$GLOBALS["base"];
        $id_category    = 1;
        $question       = "Кто такие Колобок";
        $email          = "alex@rambler.ru";
        $id             = "";
        $out 			= array();

        // очищаем базу
        DataAddTest::DeleteTestDataInDatabase();
        // формируем категории заново
        DataAddTest::AddTestDataInDatabase();

        $this->assertTrue($base->addQuestion($id_category, $question, $email, $id));

        $question2      = "Кто такие Жирафы";
        $this->assertTrue($base->addQuestion($id_category, $question2, $email, $id));
        
        $this->assertEquals(2, $base->getAllQuestionsAnswerOrNot(false, $out));

        // question - индекс 2
        $this->assertEquals($question, $out[0][2]);
        $this->assertEquals($question2, $out[1][2]);

        $etalon = "категория1";
        $this->assertEquals($etalon, $out[0][8]);
        $this->assertEquals($etalon, $out[1][8]);

        // количество ожидаемых элементов
        $this->assertEquals(9, sizeof($out[0]));

    }


    /** Метод проверяет смену категории для выбранного вопроса ( вопросов ). */
    function testChangeCategory()
    {
        $base           = &$GLOBALS["base"];

        // очищаем базу
        DataAddTest::DeleteTestDataInDatabase();

        $id_category    = 6;
        $question       = "Вопрос 7";
        $email          = "alex@rambler.ru";

        $this->assertTrue($base->addQuestion($id_category, $question, $email, $id));
        $idx[]  = $id;
        $question       = "Вопрос 8";
        $this->assertTrue($base->addQuestion($id_category, $question, $email, $id));
        $idx[]  = $id;

        // без ответа, вопрос не получим
        $answer     = "Круглый монстр";
        $answer2    = "Длинный монстр";
        $this->assertTrue($base->addAnswer($idx[0], $answer));
        $this->assertTrue($base->addAnswer($idx[1], $answer2));


        // вопросы необходимо переместить в другую категорию
        $category_new = 1;
        $this->assertEquals(2, $base->changeCategory($category_new, $idx));

        $this->assertEquals(0, $base->getCategoryQuestions($id_category, $out));
        $this->assertEquals(2, $base->getCategoryQuestions($category_new, $out));

    }

    /** Метод  проверяет удаление вопроса (вопросов). */
    function testDelQuestions()
    {
        $base           = &$GLOBALS["base"];

        $id_category    = 5;
        $question       = "Вопрос 1";
        $email          = "alex@rambler.ru";

        $this->assertTrue($base->addQuestion($id_category, $question, $email, $id));
        $idx[]  = $id;
        $question       = "Вопрос 2";
        $this->assertTrue($base->addQuestion($id_category, $question, $email, $id));
        $idx[]  = $id;
        $question       = "Вопрос 3";
        $this->assertTrue($base->addQuestion($id_category, $question, $email, $id));
        $idx[]  = $id;

        $count = $base->delQuestions(TYPE_DELETE, $idx);
        $this->assertEquals(3, $count);

        // вопросов уже нет
        $this->assertFalse($base->getCategoryQuestions($id_category, $out));

        // проверяем выключение вопросов из поиска
        $idx            = array();
        $question1      = "Вопрос 1";
        $this->assertTrue($base->addQuestion($id_category, $question1, $email, $id));
        $idx[]  = $id;
        $question2      = "Вопрос 2";
        $this->assertTrue($base->addQuestion($id_category, $question2, $email, $id));
        $idx[]  = $id;

        $count = $base->delQuestions(TYPE_DISABLE, $idx);
        $this->assertEquals(2, $count);

        // вопросы выключены
        $this->assertFalse($base->getCategoryQuestions($id_category, $out));

        // но в базе они остались
        $q = $base->db_query("
            SELECT question
            FROM ".QUESTION_TABLE."
            WHERE ID='$idx[0]' OR ID='$idx[1]'"
        ) or die($base->db_error());

        $out = array();
        while ($row = $base->db_fetch_row($q)) {
            $out[] = $row[0];
        }

        $this->assertEquals($question1, $out[0]);
        $this->assertEquals($question2, $out[1]);

    } // testDelQuestions

    /** Метод проверяет добавление ответа  на вопрос в базу. */
    function testAddAnswer()
    {
        $base           = &$GLOBALS["base"];

        // очищаем базу
        DataAddTest::DeleteTestDataInDatabase();

        $id_category    = 6;
        $question       = "Кто такие колобок и два жирафа";
        $email          = "alex@rambler.ru";

        $this->assertTrue($base->addQuestion($id_category, $question, $email, $id));

        $answer = "
            Колобок и два жирафа, это персонажи детской передачи,
            которая выходит на радио по воскресеньям в 11 часов утра.%%_
            ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --
        ";

        $this->assertTrue($base->addAnswer($id, $answer));

        $this->assertTrue($base->getCategoryQuestions($id_category, $out));

        $etalon = "
            Колобок и два жирафа, это персонажи детской передачи,
            которая выходит на радио по воскресеньям в 11 часов утра.
            ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --
        ";
        // нет символов %%_
        $this->assertEquals($etalon, $out[0][3]);

    }

    /** Метод проверяет добавление ответа  на вопрос в базу. */
    function testAddCategory()
    {
        $base           = &$GLOBALS["base"];

        // очищаем базу
        DataAddTest::DeleteTestDataInDatabase();


        $category = "Новая категория";
        $id_parent = 0;
        $this->assertTrue($id = $base->addCategory($id_parent, $category));

        // данная категория уже есть
        $this->assertFalse($base->addCategory($id_parent, $category));
		$this->assertEquals($id, $base->addCategory($id_parent, $category, true));

        $category = "Новая категория2";
        $this->assertTrue($id2 = $base->addCategory($id, $category));
        $this->assertFalse($base->addCategory($id, $category));
		$this->assertEquals($id2, $base->addCategory($id_parent, $category, true));

    } // testAddCategory

    /** Метод проверяет добавление ответа  на вопрос в базу. */
    function testDelCategory()
    {
        $base           = &$GLOBALS["base"];

        // очищаем базу
        DataAddTest::DeleteTestDataInDatabase();


        $category = "Новая категория";
        $id_parent = 0;
        $id = $base->addCategory($id_parent, $category);

		// 0 - категория успешно удалена
		// 1 - категория удалена, но содержит вопросы, которые перенесли в корневую
		// 2 - категория содержит под категории, вначале удалите их 
		$this->assertEquals(0, $base->delCategory($id));

        $category = "Новая категория";
        $id_category = $base->addCategory($id_parent, $category);

        $question       = "Тестовый вопрос";
        $email          = "mail@mail.ru";
        $base->addQuestion($id_category, $question, $email, &$id);
        $this->assertEquals(1, $base->delCategory($id_category));

        $category = "Новая категория";
        $id_category = $base->addCategory($id_parent, $category);

        $category2 = "под категория";
        $id2 = $base->addCategory($id_category, $category2);

		$this->assertEquals(2, $base->delCategory($id_category));

		$id_category = 0;
        $this->assertEquals(-1, $base->delCategory($id_category));

    } // testDelCategory





} // QuestionBaseTest

/*! @} */

?>
